package bag2;
//Description:多态以及包
//default 包访问权限
//继承  对共性的抽取 关键字extends进行处理   意义：可以对代码进行重用
//组合：a part of 一部分将类的实例作为另一个类的字段（has a）的关系
final class A{//如果一个类不想被继承可设置为final修饰  final 修饰方法：
    //final 修饰属性 就是常量了

}
class Animal{
    public String name;//当子类变量未赋值的时候 如果同名的 优先访问自己的 除非super来引用
    // （比如给父类赋初值而自己没有赋值 此值应是null除非使用super）
    public int age;//子类里面只能访问公共类型的 不能访问 私有类型的
    private int count;//子类不能访问
    protected String sex;//不同包当中 的子类 需要使用super来访问 同一包中都可以 只要是子类都可以访问子类不可以访问
    //protected保证其他类继承时可以使用  用public 在哪都可以使用
    public void eat(){
        System.out.println(name + "正在吃");
    }
    Animal(String name,int age){
        //eat();在父类构造方法里面调用重写 也会发生动态绑定
        this.name = name;
    }
}
class Dog extends Animal{//继承（Dog Brid 都是子类 或者派生类  Animal 是父类 基类或超类）
    public Dog(String name,int age){
        super(name,age);//显示调用构造方法
    }
    @Override
    public void eat(){
        System.out.println(name + "正在大口吃");
    }
}
class Brid extends Animal{//java当中是单继承 不能多继承  子类构造同时要帮助父类来进行构造
//super()；调用父类的构造方法       super不能出现在静态方法中  super:子类调用父类的
//super.fun（）；调用父类的普通方法
//super.data调用父类的成员属性
    public String wing;
    public Brid(String name,int age,String wing){
        super(name,age);//显示调用构造方法  super只能在当前构造方法中  且只能在第一行
        this.wing = wing;
    }
    public void fly(){
        System.out.println(name + "正在飞");
    }

}

public class Test {
    public static void func(Animal animal) {

    }

    public static void main(String[] args) {
        Dog dog = new Dog("huahua", 2);
        System.out.println(dog.name);
        dog.eat();
        System.out.println(dog.sex);
        Animal animal = new Dog("hh", 2);//向上转型  父类引用 引用子类对象（1.直接赋值2.作为函数的参数）
        //编译时不知道调用睡的 运行时才知道是否重写 这就是动态绑定  重载是静态绑定（编译时就知道调用哪个函数）
        animal.eat();//动态绑定：父类引用引用子类的对象  通过这个父类引用调用父类 和子类同名的覆盖方法
        //（重写）：1方法名相同  2参数类表相同 3返回值相同（4必须在父子类的情况下）  如果子类重写了 调用自己的 如果没有调用父类的
        //重写时 方法不能是静态的 子类的访问限定修饰符一定要da?于父类的（public> protected > default>private(private不能修饰重写) ）
        //被final修饰的不能被重写（返回值有时候可以不同  必须是父子类型的（协变类型也构成重写））
        Dog dog1 = new Dog("huhua", 2);
        func(dog1);//作为函数的参数
        Animal animal2 = new Brid("zz", 5, "fly");
        if (animal2 instanceof Brid) {//引用的是不是brid实例
            Brid brid = (Brid) animal2;//向下转型  不是很安全
            brid.fly();
        }
    }
}

//多态  向下转型  重写 动态绑定  静态绑定 （重载）